import { API_BASE_URL } from './config';

/**
 * 基础API请求
 * @param {Object} options - 请求选项
 * @returns {Promise} 请求结果
 */
export const baseRequest = (options) => {
  // 获取存储的token（如果有）
  const token = uni.getStorageSync('token');
  
  // 构建完整的请求选项
  const requestOptions = {
    ...options,
    url: options.url.startsWith('http') ? options.url : `${API_BASE_URL}${options.url}`,
    header: {
      'Content-Type': 'application/json',
      ...(token ? { 'Authorization': token } : {}), // 如果有token，添加到请求头
      ...options.header
    }
  };
  
  return new Promise((resolve, reject) => {
    uni.request({
      ...requestOptions,
      success: (res) => {
        // 处理特殊的HTTP状态码
        if (res.statusCode === 401 && res.data?.error === '未提供认证token') {
          // 如果是因为未提供token而失败，不强制跳转到登录页，让业务逻辑自己处理
          // 这样可以支持某些页面在无登录状态下的只读访问
          console.warn('API请求需要认证token，但未提供');
        }
        resolve(res);
      },
      fail: (err) => {
        // 处理网络错误
        console.error('API请求失败:', err);
        reject(err);
      }
    });
  });
};

/**
 * 封装带token的API请求
 * @param {Object} options - 请求选项
 * @returns {Promise} 请求结果
 */
export const requestWithToken = (options) => {
  // 获取存储的token
  const token = uni.getStorageSync('token');
  
  // 如果没有token，跳转到登录页
  if (!token) {
    uni.redirectTo({
      url: '/pages/login/login'
    });
    return Promise.reject(new Error('未登录'));
  }
  
  // 构建完整的请求选项
  const requestOptions = {
    ...options,
    url: options.url.startsWith('http') ? options.url : `${API_BASE_URL}${options.url}`,
    header: {
      'Content-Type': 'application/json',
      'Authorization': token,  // 在请求头中添加token
      ...options.header
    }
  };
  
  return new Promise((resolve, reject) => {
    uni.request({
      ...requestOptions,
      success: (res) => {
        // 处理特殊的HTTP状态码
        if (res.statusCode === 401) {
          // 未授权或token过期，清除token并重定向到登录页
          uni.removeStorageSync('token');
          uni.removeStorageSync('userInfo');
          uni.redirectTo({
            url: '/pages/login/login'
          });
          reject(new Error('登录过期，请重新登录'));
          return;
        }
        
        resolve(res);
      },
      fail: (err) => {
        // 处理网络错误
        console.error('API请求失败:', err);
        reject(err);
      }
    });
  });
};

/**
 * GET请求（带token验证）
 * @param {string} url - 请求URL
 * @param {Object} params - 请求参数
 * @returns {Promise} 请求结果
 */
export const get = (url, params = {}) => {
  return requestWithToken({
    url,
    method: 'GET',
    data: params
  });
};

/**
 * POST请求（带token验证）
 * @param {string} url - 请求URL
 * @param {Object} data - 请求数据
 * @returns {Promise} 请求结果
 */
export const post = (url, data = {}) => {
  return requestWithToken({
    url,
    method: 'POST',
    data
  });
};

/**
 * PUT请求（带token验证）
 * @param {string} url - 请求URL
 * @param {Object} data - 请求数据
 * @returns {Promise} 请求结果
 */
export const put = (url, data = {}) => {
  return requestWithToken({
    url,
    method: 'PUT',
    data
  });
};

/**
 * GET请求（不带token验证）
 * @param {string} url - 请求URL
 * @param {Object} params - 请求参数
 * @returns {Promise} 请求结果
 */
export const baseGet = (url, params = {}) => {
  return baseRequest({
    url,
    method: 'GET',
    data: params
  });
};

/**
 * POST请求（不带token验证）
 * @param {string} url - 请求URL
 * @param {Object} data - 请求数据
 * @returns {Promise} 请求结果
 */
export const basePost = (url, data = {}) => {
  return baseRequest({
    url,
    method: 'POST',
    data
  });
};

/**
 * PUT请求（不带token验证）
 * @param {string} url - 请求URL
 * @param {Object} data - 请求数据
 * @returns {Promise} 请求结果
 */
export const basePut = (url, data = {}) => {
  return baseRequest({
    url,
    method: 'PUT',
    data
  });
};

/**
 * DELETE请求（不带token验证）
 * @param {string} url - 请求URL
 * @returns {Promise} 请求结果
 */
export const baseDel = (url) => {
  return baseRequest({
    url,
    method: 'DELETE'
  });
};

/**
 * DELETE请求
 * @param {string} url - 请求URL
 * @returns {Promise} 请求结果
 */
export const del = (url) => {
  return requestWithToken({
    url,
    method: 'DELETE'
  });
};

/**
 * 检查登录状态
 * @returns {boolean} 是否已登录
 */
export const isLoggedIn = () => {
  const token = uni.getStorageSync('token');
  return !!token;
};

/**
 * 退出登录
 */
export const logout = () => {
  uni.removeStorageSync('token');
  uni.removeStorageSync('userInfo');
  uni.redirectTo({
    url: '/pages/login/login'
  });
};